import cvxpy as cp


def F7_MPC_Controller_withConstriants(x, M, H, F, P, Beta_bar, b, p, h_t_k):

    set_point = 18
    # 定义控制输入U为优化变量
    U = cp.Variable((P.shape[1],1))
    Beta_bar = Beta_bar.reshape(-1, 1)

    # 定义约束条件
    constraints = [P @ U <= Beta_bar + b @ x]

    # 定义目标函数,我们取其负值，因为 cvxpy 默认进行的是极小化优化
    objective = cp.Minimize(cp.quad_form(U, H) + (M @ x).T @ U + (F @ h_t_k).T @ U )

    # 定义并解决优化问题
    prob = cp.Problem(objective, constraints)
    prob.solve()

    # 取优化解的第一个元素作为 u
    u = U.value[0:p]

    return U.value, u